// 控制应用生命周期和创建原生浏览器窗口的模组
const {
  app,
  BrowserWindow,
  Tray,
  nativeImage,
  Menu,
  screen,
  ipcMain,
} = require("electron");
const path = require("path");
const { uIOhook } = require("uiohook-napi"); // 监听鼠标
const SettingWindow = require("./SettingWindow");
const handleFileEvent = require("./handleFileEvent");

const NODE_ENV = process.env.NODE_ENV;

let tray = null;
let settingWindow = null;

function createWindow() {
  const primaryDisplay = screen.getPrimaryDisplay();
  const { width, height } = primaryDisplay.workAreaSize;
  const { x, y } = primaryDisplay.workArea;
  // 创建浏览器窗口
  const mainWindow = new BrowserWindow({
    // width: width,
    // height: height,
    // x: x, // 工作区起始X坐标
    // y: y, // 工作区起始Y坐标
    frame: false,
    transparent: true,
    fullscreen: true,
    // 窗口可调整大小
    resizable: false,
    // 窗口可移动
    movable: false,
    // 可选：始终置顶
    alwaysOnTop: true,
    // 隐藏滚动条
    autoHideMenuBar: true,
    webPreferences: {
      contextIsolation: true,
      webgl: true,
      preload: path.join(__dirname, "preload.js"),
    },
    icon: path.join(__dirname, "./../public/icon.png"),
  });
  // 打开开发工具
  // if (NODE_ENV === "development") {
  //   mainWindow.webContents.openDevTools();
  // }

  // 禁用开发工具
  mainWindow.webContents.on("before-input-event", (event, input) => {
    if (
      input.key === "F12" ||
      (input.control && input.shift && input.key === "I")
    ) {
      event.preventDefault(); // 禁用键盘快捷键打开开发者工具
    }
  });

  // 监听文件事件
  handleFileEvent(mainWindow);

  ipcMain.handle("on-set-top-event", (event, isTop) => {
    mainWindow.setAlwaysOnTop(isTop);
  });

  // 设置位置响应函数
  ipcMain.handle("on-set-pos-event", (e, data) => {
    mainWindow.webContents.send("setting-msg", data);
  });

  // 设置窗口穿透点击事件
  mainWindow.setIgnoreMouseEvents(true, { forward: true });
  // 加载 index.html
  // mainWindow.loadFile('dist/index.html') 将该行改为下面这一行，加载url
  mainWindow.loadURL(
    NODE_ENV === "development"
      ? "http://localhost:5173" + "#/hand"
      : `file://${path.join(__dirname, "../dist/index.html")}` + "#/hand"
  );

  // ------------------------创建托盘--------------------------
  // 准备托盘图标
  // let iconPath = path.join(__dirname, "../src/assets", "icon.png"); // 替换为你的图标路径
  // 对于开发环境，你可能需要根据实际情况调整路径
  let iconPath = 
    NODE_ENV === "development"? 
    path.join(app.getAppPath(), "public", "icon.png"):
    path.join(__dirname, "../dist/icon.png");
  let nimg = nativeImage.createFromPath(iconPath);
  tray = new Tray(nimg);

  // 创建右键菜单模板:cite[1]:cite[3]
  const contextMenu = Menu.buildFromTemplate([
    {
      label: "显示/隐藏", // 可以添加其他控制选项
      click: () => {
        if (mainWindow.isVisible()) {
          mainWindow.hide();
        } else {
          mainWindow.show();
        }
      },
    },
    { type: "separator" }, // 分隔线
    {
      label: "设置",
      click: () => {
        try {
          settingWindow.show();
        } catch (error) {
          settingWindow = SettingWindow();
        }
      },
    },
    { type: "separator" }, // 分隔线
    {
      label: "退出",
      click: () => {
        app.quit(); // 点击退出菜单时退出应用:cite[1]:cite[2]
      },
    },
  ]);

  // 设置托盘的悬停提示:cite[2]:cite[3]
  tray.setToolTip("桌面手");
  // 将右键菜单绑定到托盘:cite[1]:cite[3]
  tray.setContextMenu(contextMenu);

  // // 可选：点击托盘图标显示/隐藏窗口（根据平台不同，click 事件行为可能不同）
  tray.on("click", () => {
    // 在某些平台上，点击托盘图标本身不会显示窗口，通常用右键菜单操作。
    // 如果你希望在点击（左键）时也显示窗口，可以在这里调用 mainWindow.show();
    // 调出托盘
    tray.popUpContextMenu(contextMenu);
  });

  // -----------------------------创建 uiohook 实例-----------------------------
  // 将按钮代码转换为可读的按钮名称
  function getMouseButton(buttonCode) {
    switch (buttonCode) {
      case 1:
        return "left";
      case 2:
        return "right";
      case 3:
        return "middle";
      case 4:
        return "browser_back";
      case 5:
        return "browser_forward";
      default:
        return `button_${buttonCode}`;
    }
  }
  // 监听鼠标点击事件
  uIOhook.on("click", (event) => {
    // 发送点击事件到渲染进程
    if (mainWindow && mainWindow.webContents) {
      mainWindow.webContents.send("global-mouse-click", {
        x: event.x,
        y: event.y,
        button: getMouseButton(event.button),
        timestamp: Date.now(),
        type: "uiohook-napi",
        clicks: event.clicks || 1,
      });
    }
  });

  // 监听鼠标按下事件（可选）
  uIOhook.on("mousedown", (event) => {
    // 发送点击事件到渲染进程
    if (mainWindow && mainWindow.webContents) {
      mainWindow.webContents.send("global-mouse-down", {
        x: event.x,
        y: event.y,
        button: getMouseButton(event.button),
        timestamp: Date.now(),
        type: "uiohook-napi",
        clicks: event.clicks || 1,
      });
    }
  });

  // 监听鼠标释放事件（可选）
  uIOhook.on("mouseup", (event) => {
    // 发送点击事件到渲染进程
    if (mainWindow && mainWindow.webContents) {
      mainWindow.webContents.send("global-mouse-up", {
        x: event.x,
        y: event.y,
        button: getMouseButton(event.button),
        timestamp: Date.now(),
        type: "uiohook-napi",
        clicks: event.clicks || 1,
      });
    }
  });

  // 启动 uiohook
  uIOhook.start();
}

// 这段程序将会在 Electron 结束初始化
// 和创建浏览器窗口的时候调用
// 部分 API 在 ready 事件触发后才能使用。
app.whenReady().then(() => {
  createWindow();

  app.on("activate", function () {
    // 通常在 macOS 上，当点击 dock 中的应用程序图标时，如果没有其他
    // 打开的窗口，那么程序会重新创建一个窗口。
    if (BrowserWindow.getAllWindows().length === 0) createWindow();
  });
});
// 除了 macOS 外，当所有窗口都被关闭的时候退出程序。 因此，通常对程序和它们在
// 任务栏上的图标来说，应当保持活跃状态，直到用户使用 Cmd + Q 退出。
app.on("window-all-closed", function () {
  if (process.platform !== "darwin") app.quit();
});

// 在这个文件中，你可以包含应用程序剩余的所有部分的代码，
// 也可以拆分成几个文件，然后用 require 导入。
